import axios from 'axios'
import Vue from 'vue'
import store from '@/store'
import router from '@/router'
import { Message } from 'element-ui'
import { getTimestamp, setTimestamp } from './auth'
const Timeout = 3600 // 定义超时时间 默认毫秒

// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000, // request timeout

  // 封装自己的get/post方法
  get: function(path = '', data = {}) {
    return new Promise((resolve, reject) => {
      axios.get(path, {
        params: data
      })
        .then(function(response) {
          resolve(response.data)
        })
        .catch(function(error) {
          reject(error)
        })
    })
  },
  post: function(path = '', data = {}) {
    return new Promise((resolve, reject) => {
      axios.post(path, data)
        .then(function(response) {
          resolve(response.data)
        })
        .catch(function(error) {
          reject(error)
        })
    })
  },
  // axios发送并发请求
  // axios.all([])返回的结果是一个数组，使用axios.spread可将数组[res1,res2]展开为res1，res2
  all: function(list) {
    return new Promise(function(resolve, reject) {
      axios.all(list)
        // ...为分解其内容
        .then(axios.spread(function(...result) {
          resolve(result)
        }))
        .catch(function(err) {
          reject(err)
        })
    })
  }
})

let count = 0
// 请求拦截器
service.interceptors.request.use(function(config) {
  count++
  Vue.showLoading()
  // 在这个位置需要统一的去注入token
  if (store.getters.token) {
    // 如果token存在 注入token
    // console.log(config)
    // 在headers中添加 Authorization = Bearer token值
    config.headers['Authorization'] = `Bearer ${store.getters.token}`
    if (IsCheckTimeOut()) {
      // 如果它为true表示 过期了
      // token没用了 因为超时了
      store.dispatch('user/logout') // 退出操作
      // 跳转登录页
      router.push('/login')
      return Promise.reject(new Error('token超时了'))
    }
    setTimestamp()
  }
  return config
}, function(error) {
  // 对请求错误做些什么
  // 有错误的时候隐藏菊花
  Vue.hiddenLoading()
  return Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(function(response) {
  count--
  if (count === 0) {
    Vue.hiddenLoading()
  }
  // 结构出来
  const { success, message, data } = response.data
  if (success) {
    // Message.success(message)
    // 返回数据中的对象,方便后面的数据渲染
    return data
  } else {
    Message.error(message)
    return Promise.reject(message)
  }
}, function(error) {
  // 对响应错误做点什么
  Vue.hiddenLoading()
  // console.dir(error)
  // token超时被动介入
  if (error.response && error.response.data && error.response.data.code === 10002) {
    store.dispatch('user/logout') // 退出操作
    router.push('/login') // 跳转登录页
  } else {
    Message.error(error.message) // 提示错误信息
  }
  return Promise.reject(error)
})

// 是否超时
// 超时逻辑  (当前时间  - 缓存中的时间) 是否大于 时间差
function IsCheckTimeOut() {
  const currentTime = Date.now()

  const timeStamp = getTimestamp()
  // 除1000就是秒比较
  return (currentTime - timeStamp) / 1000 > Timeout
}

export default service
